﻿using System;

namespace Sunny.FrameDecoder;

/// <summary>
/// 控制台日志记录
/// </summary>
public class ConsoleLogger
{
    /// <summary>
    /// 默认实例
    /// </summary>
    public static ConsoleLogger Instance = new ConsoleLogger();

    /// <summary>
    /// 构造函数
    /// </summary>
    public ConsoleLogger(LogLevel level = LogLevel.Info)
    {
        Level = level;
    }

    /// <summary>
    /// 日志级别
    /// </summary>
    public LogLevel Level { get; set; } = LogLevel.Off;

    /// <summary>
    /// 详细信息：通常用于内部调试目的。包含最详细的跟踪信息。
    /// </summary>
    public void Trace(params object[] args)
    {
        if (LogLevel.Trace >= Level) WriteLine("Trace", args);
    }

    /// <summary>
    /// 调试信息：通常用于记录程序运行时的详细流程信息。
    /// </summary>
    public void Debug(params object[] args)
    {
        if (LogLevel.Debug >= Level) WriteLine("Debug", args);
    }

    /// <summary>
    /// 一般信息：通常用于记录应用程序的运行流程或业务逻辑处理情况，不包含敏感信息。
    /// </summary>
    public void Info(params object[] args)
    {
        if (LogLevel.Info >= Level) WriteLine("Info", args);
    }

    /// <summary>
    /// 警告信息：表示可能发生的问题，但不一定影响应用程序的运行。
    /// </summary>
    public void Warn(params object[] args)
    {
        if (LogLevel.Warn >= Level) WriteLine("Warn", args);
    }

    /// <summary>
    /// 错误信息：表示应用程序的某个部分发生了错误，但应用程序仍能继续运行。
    /// </summary>
    public void Error(params object[] args)
    {
        if (LogLevel.Error >= Level) WriteLine("Error", args);
    }

    /// <summary>
    /// 致命错误：表示应用程序遇到了无法恢复的错误，通常会导致应用程序的崩溃或停止运行。
    /// </summary>
    public void Fatal(params object[] args)
    {
        if (LogLevel.Fatal >= Level) WriteLine("Fatal", args);
    }

    /// <summary>
    /// 日期格式
    /// </summary>
    public const string DateTimeFormatEx = "yyyy-MM-dd HH:mm:ss.fff";

    private void WriteLine(string msgType, params object[] args)
    {
        Console.WriteLine($"{DateTime.Now.ToString(DateTimeFormatEx)} | {msgType} | {string.Join(",", args)}");
    }
}

/// <summary>
/// 日志级别
/// </summary>
public enum LogLevel
{
    /// <summary>
    /// 详细信息：通常用于内部调试目的。包含最详细的跟踪信息。
    /// </summary>
    Trace = 0,

    /// <summary>
    /// 调试信息：通常用于记录程序运行时的详细流程信息。
    /// </summary>
    Debug = 1,

    /// <summary>
    /// 一般信息：通常用于记录应用程序的运行流程或业务逻辑处理情况，不包含敏感信息。
    /// </summary>
    Info = 2,

    /// <summary>
    /// 警告信息：表示可能发生的问题，但不一定影响应用程序的运行。
    /// </summary>
    Warn = 3,

    /// <summary>
    /// 错误信息：表示应用程序的某个部分发生了错误，但应用程序仍能继续运行。
    /// </summary>
    Error = 4,

    /// <summary>
    /// 致命错误：表示应用程序遇到了无法恢复的错误，通常会导致应用程序的崩溃或停止运行。
    /// </summary>
    Fatal = 5,

    /// <summary>
    /// 关闭日志记录：这是一个特殊的级别，用于关闭日志记录。
    /// </summary>
    Off = 6
}